package es.uned.etsii.si3.taller.servlets;

import java.sql.SQLException;
import java.util.List;

import com.j256.ormlite.stmt.QueryBuilder;
import com.j256.ormlite.stmt.Where;
import com.opensymphony.xwork2.ActionSupport;

import es.uned.etsii.si3.taller.FactoriaDAO;
import es.uned.etsii.si3.taller.Vehiculo;

public class AdminBusquedaVehiculos extends ActionSupport {
	private static final long serialVersionUID = 1L;

	private Vehiculo vehiculo = null;
	
	private String matricula = "";
	private String marca     = "";
	private String modelo    = "";
	private List<Vehiculo> listaVehiculos;

	// Getters / Setters
	
	public Vehiculo getVehiculo() {
		return vehiculo;
	}

	public String getMatricula() {
		return matricula;
	}
	
	public String getMarca() {
		return marca;
	}

	public String getModelo() { 
		return modelo; 
	}

	
	public List<Vehiculo> getListaVehiculos() {
		return listaVehiculos;
	}
	
	public void setMatricula(String matricula) {
		if (matricula != null)
			this.matricula = matricula.trim();
	}
	
	public void setMarca(String marca) {
		if (marca != null)
			this.marca = marca.trim();
	}
	
	public void setModelo(String modelo) {
		if (modelo != null)
			this.modelo = modelo.trim();
	}
	
	private String hacerLike(String valor) {
		return "%" + valor + "%";
	}

	// Comprobación rápida para saber si queremos hacer una consulta, o no
	private boolean tieneLongitud(String t) { if (t.length() > 0) return true; return false; }

	private boolean hayCondiciones() {
		if (tieneLongitud(getMarca()) || 
				tieneLongitud(getModelo()) || 
				tieneLongitud(getMatricula()))
			return true;
		return false;
	}

	/**
	 * Búsqueda de vehículos por parte del admin
	 * En hayCondiciones comprueba los parámetros introducidos
	 * Si son correctos, hace la búsqueda
	 */
	@Override
	public String execute() {
		if (!hayCondiciones()) {
			addActionMessage("No se puede hacer una consulta sin introducir alguna restricción");
			return SUCCESS;
		}
		
		try {
			boolean doOr = false;

			QueryBuilder<Vehiculo, Integer> vehiculoQb = FactoriaDAO.getQueryBuilder(Vehiculo.class);

			Where<Vehiculo, Integer> whereVehiculo = vehiculoQb.where();

			if (tieneLongitud(getMatricula())) {
				if (doOr) whereVehiculo.or();

				whereVehiculo.like(Vehiculo.MATRICULA_FIELD_NAME, hacerLike(getMatricula()));
				doOr = true;
			}

			if (tieneLongitud(getMarca())) {
				if (doOr) whereVehiculo.or();

				whereVehiculo.like(Vehiculo.MARCA_FIELD_NAME, hacerLike(getMarca()));
				doOr = true;
			}

			if (tieneLongitud(getModelo())) {
				if (doOr) whereVehiculo.or();

				whereVehiculo.like(Vehiculo.MODELO_FIELD_NAME, hacerLike(getModelo()));
				doOr = true;
			}			

			listaVehiculos = vehiculoQb.query();

			if (listaVehiculos.size() == 0)
				addActionMessage("No se encontraron vehículos que coincidan");
		} catch (SQLException e) {
			addActionError("Al intentar hacer la búsqueda: " + e.toString());
		}
		return SUCCESS;
	}
}